﻿/*
 * Created by SharpDevelop.
 * User: it1050
 * Date: 22/08/10
 * Time: 21.25
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */

namespace PNDbManagement
{
	using System;
	using System.Data;
	using System.Data.SQLite;
	using System.Data.Common;
	
	/// <summary>
	/// Classe di incapsulazione per l'accesso ai dati.
	/// </summary>
public class PNDBDataInterface
	{ 
		//interfaccia di accesso al DB
		
		#region variables
			/// <summary> stringa SQL <summary>
			private string _lvpSQL="";
			/// <summary> var x indicazione della posizione del DB <summary>
			private string _lvpDBFullName="";
			/// <summary> connessione al DB <summary>
			private DbConnection _lvCnn;
			/// <summary> definizione comando SQL <summary>
			private DbCommand _lvCmd;
			/// <summary> data reader per ecupero record <summary>
			public static DbDataReader _gvDataReader;
			
		#endregion
		
		/// <summary> Stringa SQL per i command da eseguire </summary>
		public string SetSQLString
		{ // stringa SQL per caricare i dati nella form
			set {_lvpSQL = value;}
		} // setSQLString

		/// <summary> Impostazione del nome del db da aprire </summary>
		public string _pDBFullName
		{
			get {return _lvpDBFullName;}
			set {_lvpDBFullName = @"Data Source="+value;}
		} // _pDBFullName	
		
		/// <summary>Attivazione della connessione al db solo se il valore della var lvDBFullName non è vuoto <summary>
		public bool fDBConnect ()
		{
			// se è impostata la proprietà nome del DB allora creo la connessione
			if (String.IsNullOrEmpty(_lvpDBFullName) )
				return false;
			else
			{ 
	    	//uso la var _lvCnn x mantenere la persistenza nella connessione
				_lvCnn = new SQLiteConnection(_lvpDBFullName);
	      // Open the connection. If the database doesn't exist, it will be created automatically
	      try 
	      {
	      	_lvCnn.Open();
	      } 
	      catch (Exception)
	      { return false;	}
	      //se tutto ok allora imposto la var cmd per passare le stringhe SQL
	      _lvCmd = _lvCnn.CreateCommand();
	    	return true;
			}
		}  //fDBConnect
    
		/// <summary> Disconnessione dal DB </summary>
		public bool fDBDisconnect ()
		{
			//Close DB connection
			//verifico che la connessione sia attiva
			if (_lvCnn.State != ConnectionState.Closed)
			{
				_lvCnn.Close();
				return true;
			}
			else
				return false;
		} // fDBDisconnect
		
		///<summary> Creo un nuovo DB con tutte le tabelle </summary>
		public bool fDBCreateNew ()
		{ 
			//verifico che la connessione sia attiva in caso contrario la riattivo 
			if (_lvCnn == null) 
			{
				if (!fDBConnect() ) //verifico che la connessione sia andata a buon fine altrimenti esco
				{ return false; }
			}
			//TODO: impostare la creazione di tutte le tabelle leggendo da un file di testo esterno
			
			// Creo la struttra di un nuovo db
			// tabella Piano dei conti
		  _lvCmd.CommandText = "	CREATE TABLE [DB_PDC] ([PDC_ID] INTEGER PRIMARY KEY ASC ON CONFLICT ROLLBACK AUTOINCREMENT, [PDC_COD] INTEGER UNIQUE ON CONFLICT ROLLBACK, [PDC_DES] VARCHAR (50) NOT NULL ON CONFLICT ROLLBACK)";
		  _lvCmd.ExecuteNonQuery();

//		  	"CREATE TABLE FOO (ID INTEGER PRIMARY KEY, MYVALUE VARCHAR(50)); CREATE TABLE FOO1 (ID INTEGER PRIMARY KEY, MYVALUE VARCHAR(50)) ";		  
		  
		  
		  
		  return true;
		} // fDBCreateNew
		
		///<summary> eseguo la qry e ritorno il risultato </summary>
		public DataTable fDBGetDataset ()
		{
			//creo un datatable da ritornare alla funzione chiamante
			DataTable _lvTbl = new DataTable();
			
			//verifico che una string sql sia stata passata
			if ( !string.IsNullOrEmpty(_lvpSQL)) 
			{
				//imposto la sql nel cmd
				_lvCmd.CommandText = _lvpSQL;
				//eseguo la qry
				_gvDataReader = _lvCmd.ExecuteReader();
				//verifico che vengano tornati dei valori
				if ( _gvDataReader.HasRows) 
				{
					_lvTbl.Load(_gvDataReader); //carico il datatable con i valori del datareader
				}
			}
			return _lvTbl;		
		} //fDBGetDataset

		
		public bool examplefDbConnection ()
		{
			// Create a connection and a command
    	using (DbConnection cnn = new SQLiteConnection("Data Source=test.db3"))
      using (DbCommand cmd = cnn.CreateCommand())
			{
        // Open the connection. If the database doesn't exist,
        // it will be created automatically
        cnn.Open();
        // Create a table in the database
        cmd.CommandText = "CREATE TABLE FOO (ID INTEGER PRIMARY KEY, MYVALUE VARCHAR(50))";
        cmd.ExecuteNonQuery();
        // Create a parameterized insert command
        cmd.CommandText = "INSERT INTO FOO (MYVALUE) VALUES(?)";
        cmd.Parameters.Add(cmd.CreateParameter());
        // Insert 10 rows into the database
        for (int n = 0; n < 10; n++)
        {
        	cmd.Parameters[0].Value = "Value " + n.ToString();
        	cmd.ExecuteNonQuery();
        }
        // Now read them back
        cmd.CommandText = "SELECT * FROM FOO";
        using (DbDataReader reader = cmd.ExecuteReader())
        {
        	while (reader.Read())
            {
							Console.WriteLine(String.Format("ID = {0}, MYVALUE = {1}", reader[0],	reader[1]));
            }
        }
    	}
    	Console.ReadKey();
    	return true;
		} //fDBConnection
		
		
	} //class DBDataInterface
}  // Namespace PN
